/**
 * 全局函数库，包括ajax请求
 */
 import axios from 'axios'
 // 设置超时时间
 axios.defaults.timeout = 10000
 // 设置基础路径
 axios.defaults.baseURL = '/';
 // 配置请求头信息。
 axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'
 // 跨域请求时发送Cookie
 axios.defaults.withCredentials = true
 // 请求拦截
 axios.interceptors.request.use(
   config => {
     if (config.url.endsWith('login')){
       return config;
     }
     //获取token
    let token = localStorage.getItem("token");
    // 统一给所有请求都添加token
    config.headers.token = token;
     // 每次发送请求之前判断vuex中是否存在token
     // 如果存在，则统一在http请求的header都加上token，这样后台根据token判断你的登录情况
     // 即使本地存在token，也有可能token是过期的，所以在响应拦截器中要对返回状态进行判断
     //  token && (config.headers.Authorization = token);
     return config
   },
   error => {
     return Promise.error(error)
   }
 )
 // 响应拦截
 axios.interceptors.response.use(
   response => {
     //设置响应头过滤跨域请求
     response.headers['Access-Control-Allow-Origin'] = '*';
     //判断返回数据
     if (response.data){
       //token 过期重登录
       if (response.data.code == 401){
          console.log(response.data.msg);
          window.top.location.href = window.top.location.origin + '/'
       }
     }

     if (response.status === 302) {
       return window.top.location.href = window.top.location.origin + '/'
     }
     // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
     // 否则的话抛出错误
     if (response.status === 200) {
       return Promise.resolve(response)
     } else {
       return Promise.reject(response)
     }
   },
   // 服务器状态码不是2开头的的情况
   // 这里可以跟你们的后台开发人员协商好统一的错误状态码
   // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
   // 下面列举几个常见的操作，其他需求可自行扩展
   error => {
     if (error.response && error.response.status) {
       switch (error.response.status) {
         // 401: 未登录
         // 未登录则跳转登录页面，并携带当前页面的路径
         // 在登录成功后返回当前页面，这一步需要在登录页操作。
         case 401:
           break
           // 403 token过期
           // 登录过期对用户进行提示
           // 清除本地token和清空vuex中token对象
           // 跳转登录页面
         case 403:
           // 清除token
           break
           // 404请求不存在
         case 404:

           break
           // 其他错误，直接抛出错误提示
         default:
       }
       return Promise.reject(error.response)
     }
   }
 )

 /**
   * 生成随机数
   * @returns {number}
   */
 function random () {
   return Date.now() + Number(Math.random().toString(10).substr(2, 18))
 }

 const ajax = {

   //封装全局axios对象
   reqAxios: axios,
   send(axiosParam){
     // subscribe发布订阅配置信息保留
     return new Promise((resolve, reject) => {
       axios(axiosParam).then((res) => {
         resolve(res)
       }).catch((err) => {
         reject(err)
       })
     })
   },
   /**
     *
     * @param method 请求方式post/get/delete
     * @param url 请求真实路径
     * @param param 请求 请求参数
     * @param sync 同步异步标识
     * @param subscribe 订阅发布配置参数信息
     * @returns {*}
     */
   request (method, url, param, sync, subscribe, responseType) {
     if (!param) {
       param = {serialNum: random()}
     } else {
       if (!param.serialNum) {
         param.serialNum = random()
       }
     }
     let axiosParam = {
       method: method,
       url: url
     }
     if (method === 'get') {
       axiosParam.params = param
     } else {
       axiosParam.data = param
     }
     if (responseType){
       axiosParam.responseType = responseType
     }
     // subscribe发布订阅配置信息保留
     return new Promise((resolve, reject) => {
       axios(axiosParam).then((res) => {
         resolve(res)
       }).catch((err) => {
         reject(err)
       })
     })
   },
   /**
    * post请求
    * @param url 请求路径
    * @param param 请求参数
    * @param sync 是否同步
    * @param subscribe 订阅
    */
   post(url,param,sync,subscribe){
     return this.request("post", url,param,sync,subscribe)
   },
   /**
    * get请求
    * @param url 请求路径
    * @param param 请求参数
    * @param sync 是否同步
    * @param subscribe 订阅
    */
   get(url,param,sync,subscribe){
     return this.request("get", url,param,sync,subscribe)
   },
   /**
    * delete请求
    * @param url 请求路径
    * @param param 请求参数
    * @param sync 是否同步
    * @param subscribe 订阅
    */
   delete(url,param,sync,subscribe){
     return this.request("delete", url,param,sync,subscribe)
   }
 }

 export default ajax
